using System;
using MathSharp;
using System.Collections.Generic;
using System.Linq;
using System.IO;

namespace MathSharp.Script
{
	public class Script: CommandsBlock
	{
		public Script (): base(null)
		{
			script = this;
			Namespace = new Namespace(this, null, null);
		}
		
		public Namespace Namespace {
			get;
			protected set;
		}
		
		public Script(string filename): this() {
			FileName = filename;
		}
		
		internal BaseCommand ParseCommand(List<string> commandText) {
			if (commandText.Count == 0)
				throw new ParseException(FileName, commandText.GetOriginalLineSmarts(0), 0, 0x0,
				                         "Ошибка синтаксиса - получен пустой фрагмент на разбор");
			// определяем первый операнд и пытаемся подобрать нужную команду для него
			string firstLine = commandText[0];
			if (firstLine.Length == 0)
				throw new ParseException(FileName, commandText.GetOriginalLineSmarts(0), 0, 0x0,
				                         "Ошибка синтаксиса - фрагмент кода начинается с пустой строки");
			string operatorName = firstLine.Split(' ', '\t').First();
			
			BaseCommand res;
			switch(operatorName.ToLower()) {
				case "declare":
					res = DeclareCommand.SelectDeclareCommand(this, commandText);
					break;
				case "include":
					res = new IncludeCommand(this);
					break;
				case "var":
					throw new NotImplementedException();
				case "source":
					throw new NotImplementedException();
				case "if":
					throw new NotImplementedException();
				case "while":
					throw new NotImplementedException();
				case "for":
					throw new NotImplementedException();
				case "foreach":
					throw new NotImplementedException();
				default :
					throw new ParseException(FileName, commandText.GetOriginalLineSmarts(0), 0, 0x0,
				                         	 "Невозможно обработать неизвестный оператор {0}. Строка: {1}",
					                         commandText[0], firstLine);
			}
			
			res.Parse(commandText);
			
			return res;
		}
		
		public void Parse()
		{
			if (!File.Exists(FileName))
				throw new ParseException(FileName, 0, 0, 0x0, "Не найден указанный файл: {0}", FileName);
			IList<string> scriptContent = File.ReadAllLines(FileName).ToList();
			base.Parse(scriptContent);
		}
		
		public string FileName {
			get;
			protected set;
		}
	}
}

